
/* Autores:
    Medina Ojosnegros, Javier
    Gutiérrez Rodríguez, David
*/

public class Ubicacion {
    
    // Atributos
    private int [][] plazas;
    private static final int N_PLANTAS = 3;
    private static final int N_PLAZAS = 20; 
    
    
    // Constructor 
    public Ubicacion(){
        plazas = new int[N_PLANTAS][N_PLAZAS];    
    }
    
    
    // Métodos
    public int[][] getPlazas() {
        return plazas;
    }
    
    // Devuelve true si hay alguna plaza libre en el parking y false en caso contrario
    public boolean parkingLibre(){   

        for (int i = 0; i < N_PLANTAS; i++) {
            for (int j = 0; j < N_PLAZAS; j++) {
                if (plazas[i][j] == 0){
                    return true;
                }
            }
        }
        return false;
    }
    
    // Devuelve true si el 'id' de introducido por el usuario existe en alguna ubicación. Es posible que el 'id' ya no exista al ser de un vehículo que salió.
    public boolean existeTicket(int id){   

        for (int i = 0; i < N_PLANTAS; i++) {
            for (int j = 0; j < N_PLAZAS; j++) {
                if (plazas[i][j] == id){
                    return true;
                }
            }
        }
        return false;
    }  
    
    // Asigna el siguiente 'id' de Ticket a la primera posición libre en la matriz. SIEMPRE va a haber una plaza libre, si no, este método no llegaría a llamarse.
    public void asignarUbicacion(Ticket t){   
        int i = 0;
        int j = 0;                       
        boolean encontrado = false;                        
        
        while (i < N_PLANTAS && (encontrado == false)) {
            j = 0;
            while ((j < N_PLAZAS) && (encontrado == false)) {
                if (plazas[i][j] == 0){
                    plazas[i][j] = t.getId();
                    encontrado = true;
                }
                else{
                    j++;
                }
            }
            if (encontrado == false){
                i++;
            }
        }
    }
    
    // Devuelve el nº de planta del id recibido por parámetro
    public int obtenerPlanta(int id){   
        int i = 0;
        int j = 0;                       
        boolean encontrado = false;                        
        
        while (i < N_PLANTAS && (encontrado == false)) {
            j = 0;
            while ((j < N_PLAZAS) && (encontrado == false)) {
                if (plazas[i][j] == id){ 
                    encontrado = true;
                }
                else{
                    j++;
                }
            }
            if (encontrado == false){
                i++;
            }
        }
        return i;
    }
    
    // Devuelve el nº de plaza del id recibido por parámetro
    public int obtenerPlaza(int id){   
        int i = 0;
        int j = 0;
        boolean encontrado = false;                        
        
        while (i < N_PLANTAS && (encontrado == false)) {
            j = 0;
            while ((j < N_PLAZAS) && (encontrado == false)) {
                if (plazas[i][j] == id){ 
                    encontrado = true;
                }
                else{
                    j++;
                }
            }
            if (encontrado == false){
                i++;
            }
        }
        return j;
    }

    // Muestra el plano del parking con las ubicaciones libres representadas por un '0' y las ocupadas representadas por el nº de cada ticket
    public void mostrarUbicaciones(){
        System.out.println();
        for (int i = 0; i < N_PLANTAS; i++) {
            for (int j = 0; j < N_PLAZAS; j++) {
                if ( plazas[i][j] < 10 ){
                    System.out.print(plazas[i][j] + "  ");
                }
                else{
                    System.out.print(plazas[i][j] + " ");
                }
                
            }
            System.out.println();
        }
    }   
    
    // Deja libre la ubicación que ocupaba un vehículo que acaba de salir
    public void liberarUbicacion(int planta, int plaza)
    {
        plazas[planta][plaza]=0;
    }
}